#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e18;
int rt;
set<long long> s;
vector<pair<long long, long long>> v;
long long t, x, ans, pre[400005], suf[400005];
struct Tree {
	int cnt;
	struct node {
		int ls, rs, siz;
		long long v;
	}t[1600005];
	void pushup(int x) {
		t[x].siz = t[t[x].ls].siz + t[t[x].rs].siz;
		t[x].v = t[t[x].ls].v + t[t[x].rs].v;
		return;
	}
	void update(int &cur, long long l, long long r, long long x) {
		if(!cur)
			cur = ++cnt;
		if(l == r) {
			if(t[cur].siz)
				t[cur].v = t[cur].siz = 0;
			else
				t[cur].v = l, t[cur].siz = 1;
			return;
		}
		long long mid = l + r >> 1;
		if(x <= mid)
			update(t[cur].ls, l, mid, x);
		else
			update(t[cur].rs, mid + 1, r, x);
		return pushup(cur);
	}
	int query(int cur, long long l, long long r, long long k) {
		if(!cur)
			return 0;
		if(l == r)
			return t[cur].siz;
		long long mid = l + r >> 1, s = t[t[cur].ls].v;
		if(k <= s)
			return query(t[cur].ls, l, mid, k);
		return query(t[cur].rs, mid + 1, r, k - s) + t[t[cur].ls].siz;
	}
	long long queryl(int cur, long long l, long long r, long long k) {
		if(!cur)
			return 0;
		if(l == r)
			return t[cur].v;
		long long mid = l + r >> 1, s = t[t[cur].ls].siz;
		if(k <= s)
			return queryl(t[cur].ls, l, mid, k);
		return queryl(t[cur].rs, mid + 1, r, k - s) + t[t[cur].ls].v;
	}
	long long queryr(int cur, long long l, long long r, long long k) {
		if(!cur)
			return 0;
		if(l == r)
			return t[cur].v;
		long long mid = l + r >> 1, s = t[t[cur].rs].siz;
		if(k <= s)
			return queryr(t[cur].rs, mid + 1, r, k);
		return queryr(t[cur].ls, l, mid, k - s) + t[t[cur].rs].v;
	}
}T;
int main() {
	freopen("test.in", "r", stdin);
	freopen("test.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> t;
	while(t--) {
		cin >> x;
		T.update(rt, 1, inf, x);
		if(s.find(x) != s.end())
			s.erase(x);
		else
			s.insert(x);
		if(s.size() < 2) {
			cout << "0\n";
			continue;
		}
		auto p = s.rbegin();
		long long res = 0;
		ans = 0;
		for(int i = 1; i <= s.size(); i++, p++) {
			int k = T.query(rt, 1, inf, res += *p);
			// cout << "K: " << k << '\n';
			auto l = T.queryl(rt, 1, inf, k - 1) + 1, r = res - *p;
			cout << l << ' ' << r << '\n';
			if(l <= r)
				ans += r - l + 1;
		}
		// for(int i = 1; i <= s.size(); i++)
		// 	if(pre[i] < suf[i]) {
		// 		for(auto &j : v)
		// 			if((j.first > pre[i] && j.first <= suf[i]) || (j.second > pre[i] && j.second <= suf[i])) {
		// 				j.first = min(j.first, pre[i] + 1), j.second = max(j.second, suf[i]);
		// 				goto f;
		// 			}
		// 		v.push_back({pre[i] + 1, suf[i]});
		// 		f:;
		// 	}
		// 	else
		// 		break;
		// for(auto i : v)
		// 	ans += i.second - i.first + 1;
		cout << ans << '\n';
	}
	return 0;
}